interface NextTokenArrayType {
    type: string,
    token: string
}

interface NextToken {
    [index: number]: NextTokenArrayType
}

/**
 * 折叠数组
 * @param tokens 整理好的未折叠的数组
 * @returns 
 */
export default function NextToken(tokens: any): any {
    // 定义折叠数组
    let foldedToken = [];
    // 定义各一个收集器，运用引用类型的变量特性指向刚刚创建的数组
    let collector = foldedToken;
    // 定义一个栈
    let sections = [];
    // 遍历未折叠的一维tokens数组
    for(let i = 0; i < tokens.length; i++) {
        let token = tokens[i];
        // 判断当前token是# / 还是正常元素
        switch(token[0]) {
            case '#':
                // 因为当前collector的指向还是原来的正常需要放入的数组
                // 所以直接推入当前未折叠的数组中
                collector.push(token);
                // 将该项token入栈
                sections.push(token);
                // 保留当前项，在数组中推入新的一个子数组
                token[2] = [];
                // 改变收集器的指向，指向该token[2]
                collector = token[2];
                break;
            case '/':
                // 弹栈
                sections.pop(); 
                // 将collector指向改成当前栈顶元素的子数组或者最后的折叠数组
                collector = sections.length > 0? sections[sections.length - 1][2] : foldedToken;
                break;
            default: 
                // section.push(token);
                collector.push(token);
                break;        
        }
    } 

    return foldedToken;
}